Typical DP Contest D - サイコロ
提出
code: python
n, d = map(int, input().split())
# D の倍数を列挙できれば良い
# 1,2,3,4,5,6
# 1,2.3.4.5.6
# ...
解答
code: python
n, d = map(int, input().split())
# 1,2,3,4,5,6
# サイコロの目を素因数分解すると、2, 3, 5しか現れない
# サイコロの目に存在する素因数 2, 3, 5 の指数のみを考えれば良い
count2 = 0
count3 = 0
count5 = 0
while d % 2 == 0:
d //= 2
count2 += 1
while d % 3 == 0:
d //= 3
count3 += 1
while d % 5 == 0:
d //= 5
count5 += 1
# 2, 3, 5以外があったらだめ
if d != 1:
print(0)
exit()
# print(count2, count3, count5)
# 1 1 0
# dpic2c3c5 := サイコロを i 回振って、2^c2 * 3^c3 * 5^c5 になる確率 # =
# 出た目の積に含まれる素因数 2,3,5 の個数がそれぞれ c2, c3, c5 になる確率
dp = [[[0 * (count5 + 1) for _ in range(count3 + 1)] for _ in range(count2 + 1)] for _ in range(n + 1)] # print(dp)
# [0, [0, 0], 0, 0, [0, 0], 0, 0, [0, 0], 0] # サイコロの目1~6を2, 3, 5で素因数分解
# サイコロを n 回振る。
# 1 回目のループでは dp0000 = 1 しか反映対象にならない (0 += 0.3333) for i in range(n):
# c2,c3,c5および6つの目についてi+1のdpを更新
for c2 in range(min(count2+1, 6*(i+1))):
for c3 in range(min(count3+1, 6*(i+1))):
for c5 in range(min(count5+1, 6*(i+1))):
for j in range(6): # サイコロ 6 つの目
ic2 = res2 if res2 <= count2 else count2
ic3 = res3 if res3 <= count3 else count3
ic5 = res5 if res5 <= count5 else count5
テーマ
メモ
提出
code: python
n, d = map(int, input().split())
# 1 2 3 4 5 6
# O(pow(1, 6))
# O(pow(100, 6)) TLE
# n通りは自明
res = []
for i in range(1, 7):
for j in range(1, 7):
res.append(i*j)
print(res)